home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / lang / Python16_Src.lha / Python16_Source / Parser / printgrammar.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-03  |  2.5 KB  |  126 lines

  1. /* Print a bunch of C initializers that represent a grammar */
  2.  
  3. #include "pgenheaders.h"
  4. #include "grammar.h"
  5.  
  6. /* Forward */
  7. static void printarcs Py_PROTO((int, dfa *, FILE *));
  8. static void printstates Py_PROTO((grammar *, FILE *));
  9. static void printdfas Py_PROTO((grammar *, FILE *));
  10. static void printlabels Py_PROTO((grammar *, FILE *));
  11.  
  12. void
  13. printgrammar(g, fp)
  14.     grammar *g;
  15.     FILE *fp;
  16. {
  17.     fprintf(fp, "#include \"pgenheaders.h\"\n");
  18.     fprintf(fp, "#include \"grammar.h\"\n");
  19.     printdfas(g, fp);
  20.     printlabels(g, fp);
  21.     fprintf(fp, "grammar _PyParser_Grammar = {\n");
  22.     fprintf(fp, "\t%d,\n", g->g_ndfas);
  23.     fprintf(fp, "\tdfas,\n");
  24.     fprintf(fp, "\t{%d, labels},\n", g->g_ll.ll_nlabels);
  25.     fprintf(fp, "\t%d\n", g->g_start);
  26.     fprintf(fp, "};\n");
  27. }
  28.  
  29. void
  30. printnonterminals(g, fp)
  31.     grammar *g;
  32.     FILE *fp;
  33. {
  34.     dfa *d;
  35.     int i;
  36.     
  37.     d = g->g_dfa;
  38.     for (i = g->g_ndfas; --i >= 0; d++)
  39.         fprintf(fp, "#define %s %d\n", d->d_name, d->d_type);
  40. }
  41.  
  42. static void
  43. printarcs(i, d, fp)
  44.     int i;
  45.     dfa *d;
  46.     FILE *fp;
  47. {
  48.     arc *a;
  49.     state *s;
  50.     int j, k;
  51.     
  52.     s = d->d_state;
  53.     for (j = 0; j < d->d_nstates; j++, s++) {
  54.         fprintf(fp, "static arc arcs_%d_%d[%d] = {\n",
  55.             i, j, s->s_narcs);
  56.         a = s->s_arc;
  57.         for (k = 0; k < s->s_narcs; k++, a++)
  58.             fprintf(fp, "\t{%d, %d},\n", a->a_lbl, a->a_arrow);
  59.         fprintf(fp, "};\n");
  60.     }
  61. }
  62.  
  63. static void
  64. printstates(g, fp)
  65.     grammar *g;
  66.     FILE *fp;
  67. {
  68.     state *s;
  69.     dfa *d;
  70.     int i, j;
  71.     
  72.     d = g->g_dfa;
  73.     for (i = 0; i < g->g_ndfas; i++, d++) {
  74.         printarcs(i, d, fp);
  75.         fprintf(fp, "static state states_%d[%d] = {\n",
  76.             i, d->d_nstates);
  77.         s = d->d_state;
  78.         for (j = 0; j < d->d_nstates; j++, s++)
  79.             fprintf(fp, "\t{%d, arcs_%d_%d},\n",
  80.                 s->s_narcs, i, j);
  81.         fprintf(fp, "};\n");
  82.     }
  83. }
  84.  
  85. static void
  86. printdfas(g, fp)
  87.     grammar *g;
  88.     FILE *fp;
  89. {
  90.     dfa *d;
  91.     int i, j;
  92.     
  93.     printstates(g, fp);
  94.     fprintf(fp, "static dfa dfas[%d] = {\n", g->g_ndfas);
  95.     d = g->g_dfa;
  96.     for (i = 0; i < g->g_ndfas; i++, d++) {
  97.         fprintf(fp, "\t{%d, \"%s\", %d, %d, states_%d,\n",
  98.             d->d_type, d->d_name, d->d_initial, d->d_nstates, i);
  99.         fprintf(fp, "\t \"");
  100.         for (j = 0; j < NBYTES(g->g_ll.ll_nlabels); j++)
  101.             fprintf(fp, "\\%03o", d->d_first[j] & 0xff);
  102.         fprintf(fp, "\"},\n");
  103.     }
  104.     fprintf(fp, "};\n");
  105. }
  106.  
  107. static void
  108. printlabels(g, fp)
  109.     grammar *g;
  110.     FILE *fp;
  111. {
  112.     label *l;
  113.     int i;
  114.     
  115.     fprintf(fp, "static label labels[%d] = {\n", g->g_ll.ll_nlabels);
  116.     l = g->g_ll.ll_label;
  117.     for (i = g->g_ll.ll_nlabels; --i >= 0; l++) {
  118.         if (l->lb_str == NULL)
  119.             fprintf(fp, "\t{%d, 0},\n", l->lb_type);
  120.         else
  121.             fprintf(fp, "\t{%d, \"%s\"},\n",
  122.                 l->lb_type, l->lb_str);
  123.     }
  124.     fprintf(fp, "};\n");
  125. }
  126.